package org.luxor.commons.storage.service;

import org.luxor.commons.storage.constant.StorageType;

import javax.servlet.http.HttpServletResponse;

/**
 * OSS文件存储服务
 *
 * @author Mr.Yan  @date 2019/12/19
 */
public interface IFileStorageService {

    /**
     * 获取文件
     * @param storageType  (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param fileFullPath 文件路径,如: /tmp/storage/data/2020-03-16/background_0_220440901.jpg
     * @return http://127.0.0.1/sso/tmp/storage/data/2020-03-16/background_0_220440901.jpg?storageType=1
     */
    String getFileUrl(StorageType storageType, String fileFullPath);

    /**
     * 上传文件
     *
     * @param storageType (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param fileByte    字节内容
     * @param fileName    文件名
     * @param fileSuffix  文件后缀名
     * @return
     */
    String upload(StorageType storageType, byte[] fileByte, String fileName, String fileSuffix);

    /**
     * 获取文件
     *
     * @param storageType  (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param fileFullPath 文件路径
     * @return
     */
    byte[] download(StorageType storageType, String fileFullPath);

    /**
     * Http普通下载
     *
     * @param storageType  (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param fileFullPath 文件路径
     * @param response
     */
    void httpDownload(StorageType storageType, String fileFullPath, HttpServletResponse response);

    /**
     * Http安全防盗链下载
     *
     * @param storageType  (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param fileFullPath 文件路径
     * @param token        防盗链Token
     * @param ts           防盗链Token生成时间
     * @param response
     */
    void antiStealHttpDownload(StorageType storageType, String fileFullPath, String token, Long ts, HttpServletResponse response);

    /**
     * 删除
     *
     * @param storageType  (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param fileFullPath 文件路径
     */
    void delete(StorageType storageType, String fileFullPath);

    /**
     * 上传图片并且生成缩略图（自定义大小）
     *
     * @param storageType (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param imageByte   图片内容
     * @param imageName   图片名
     * @param imageSuffix 图片后缀名
     * @param width       缩略图宽度
     * @param height      缩略图高度
     * @return
     */
    String uploadImageAndCrtThumbImage(StorageType storageType, byte[] imageByte, String imageName, String imageSuffix, int width, int height);

}
